#include "Maison.h"
#include <SD.h>
#include "Time_ced.h"


Maison::Maison()
{


}

void Maison::chauf_on(byte Num_chauffage) {
  if (Num_chauffage >=  nb_chauffages ) return;
  //if (list_chauffages[Num_chauffage].RF_interrupteur == 0) return;
  send_rf(list_chauffages[Num_chauffage].RF_interrupteur+3);
}

void Maison::chauf_off(byte Num_chauffage) {
  if (Num_chauffage >=  nb_chauffages ) return;
  //if (list_chauffages[Num_chauffage].RF_interrupteur == 0) return;
  send_rf(list_chauffages[Num_chauffage].RF_interrupteur);
}

Chauffage::Chauffage()
{
  RF_interrupteur = 91;


  group = 93;
}

Sonde::Sonde()
{
  temperature = 2124;
  last_update = 0;
  correction = 0;
}


Piece::Piece()
{
  numero_sonde = 0;
  target_temp = 92;
  v_chauf = 0;
  //Nom = "null";
}

void Maison::set_chauffage(byte Num,unsigned long RF ,byte group, byte relay)
{
  if (Num>= nb_chauffages  ) return ;
  list_chauffages[Num].RF_interrupteur = RF;
  list_chauffages[Num].group = group;
  list_chauffages[Num].relay = relay;
}

byte Maison::get_relay(byte relay,unsigned long  est_sec)
{

  for (byte i = 0;  i < nb_chauffages ; i++)
  {
    if (list_chauffages[i].relay == relay and 
      (int (list_pieces[list_chauffages[i].group].target_temp ) >= get_temp_piece(list_chauffages[i].group,est_sec)))
      return 1;
  }
  return 0;


}


int Maison::get_temp_piece(byte piece,unsigned long est_sec)
{
  if (piece >= nb_pieces ) return -1 ;
  if (list_pieces[piece].numero_sonde >= nb_sondes ) return -1 ;
  if ((est_sec - list_sondes[list_pieces[piece].numero_sonde].last_update ) >= 60*60) return 1919 ;
  return list_sondes[list_pieces[piece].numero_sonde].temperature + list_sondes[list_pieces[piece].numero_sonde].correction  ;
}


//int Maison::last_temp2(byte numero_chauffage)
//{
// if (numero_chauffage >= nb_chauffages ) return -1 ;
// if (list_chauffages[numero_chauffage].numero_sonde >= nb_sondes ) return -1 ;
// return list_sondes[list_chauffages[numero_chauffage].numero_sonde].temperature ;
//}


void Maison::group_target( byte Group, int target)
{
  list_pieces[Group].target_temp = target;
}

void Maison::group_target(  int target)
{
  for (byte i = 0;  i < nb_pieces ; i++)
    list_pieces[i].target_temp = target;
}

void Maison::conf_chauffage(unsigned long est_sec)
{ 
  static  byte i = 0 ;
  if (i < nb_chauffages-1)
    i++   ;
  else
    i = 0  ; 
    #if defined(DEBUG) 
    Serial.print("doing");
    Serial.println(i);
    #endif
  if (int (list_pieces[list_chauffages[i].group].target_temp ) >= get_temp_piece(list_chauffages[i].group,est_sec))
    {
      chauf_on(i) ;
       #if defined(DEBUG) 
      Serial.println("on");
         #endif
    }
  else
  {
    chauf_off(i) ;
     #if defined(DEBUG) 
     Serial.println("off");
        #endif
    
  }
}

void Maison::get_temp_rf(OneWire capteur , unsigned long est_sec)
{ //fonction qui renvoie résultat int en 100e de degres)
  byte data[12];
  for (byte i = 0;  i < nb_sondes ; i++)
  {
    if (list_sondes[i].type_sonde == 1)
    {
      capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
      capteur.select(list_sondes[i].adresse_sonde); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
      capteur.write(0x44,1); // lance la mesure et alimente le capteur par la broche de donnée
      delay(1000);     // au moins 750 ms
      capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
      capteur.select(list_sondes[i].adresse_sonde); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
      capteur.write( 0xBE,1); // passe en mode lecture de la RAM du capteur
      for ( byte j = 0; j < 9; j++) {           // 9 octets de RAM stockés dans 9 octets
        data[j] = capteur.read();             // lecture de l'octet de rang i stocké dans tableau data
      }
      if (data[0] == 255 )
      {
        list_sondes[i].temperature = 97 ;
      }
      else
      {
        data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles
        // --- en mode 12 bits, la résolution est de 0.0625°C - cf datasheet DS18B20
        list_sondes[i].temperature = ((data[1]<<8)+data[0])*6.25;
        list_sondes[i].last_update = est_sec;
      }
    }
    else if (list_sondes[i].type_sonde == 3 ) //&& list_sondes[i].last_update+120 <= est_sec )
    {
      list_sondes[i].temperature = list_sondes[i].adresse_sonde[0]*100;
      list_sondes[i].last_update = est_sec;
    }

  }
}

void Maison::set_rf_temp(int adresse,int temperature, unsigned long est_sec )
{ //fonction qui renvoie résultat int en 100e de degres)
  for (byte i = 0;  i < nb_sondes ; i++)
  {
    if (list_sondes[i].type_sonde == 2 and list_sondes[i].adresse_sonde[0] == adresse )
    {
      list_sondes[i].temperature = temperature;
      list_sondes[i].last_update = est_sec;
    }
  }
}

byte Maison::read_conf(byte num_file_conf,unsigned long est_sec) {
  // output the value of each analog input pin
  byte type_journee = 99;
  char current_file_conf[] = "C0.T" ;
  current_file_conf[1] =  num_file_conf ;
  File f = SD.open(current_file_conf, FILE_READ);
  if (f)
  {
    int start ;
    int pading = 0;
    do
    {
      start = f.read();
      if (start != '#')
      {
        int conf[40];
        int buffer = 0;
        byte pos = 0;
        f.read(); //le ; après le type
        do  //boucle ligne
        {
          int tmp1 = 0;
          boolean neg = FALSE ;
          for (byte j=0;j<=10;j++)   //boucle 1 chiffre anti erreur
          {
            buffer = f.read();
            if ( buffer == '-')
            { 
              neg = TRUE    ; 
            }
            else if (buffer > '9' or buffer < '0' )
            {
              break ;  //cest pas des nombres !
            }
            else
              tmp1 = tmp1*10+buffer-'0';
          }
          if (neg)
            conf[pos++] = -tmp1;
          else
            conf[pos++] = tmp1;

          //conf[pos] = -1;
        }
        while (buffer != '#' and pos<39) ;  //fin de la liste des int
        if (start == 'g')
        { 
          String tmp = "";
          pading = 0;
          buffer = f.read();
          while (buffer !=';')
          {
            tmp += (char) buffer;
            buffer  = f.read();
          }

          list_pieces[conf[0]].Nom = tmp;   
          list_pieces[conf[0]].numero_sonde = conf[1];  
          list_pieces[conf[0]].v_chauf = conf[2];    
        }
        if (start == 'c')
        {  //num RF Sonde Group
          set_chauffage(conf[0],(unsigned long) conf[1] *10000 + conf[2],conf[3],conf[4]);
        }
        if (start == 's')
        {
          if (conf[0] < nb_sondes)
          {
            list_sondes[conf[0]].type_sonde = conf[1];
            list_sondes[conf[0]].correction = conf[2];
            for( byte i = 0; i < 8; i++)
              list_sondes[conf[0]].adresse_sonde[i] = conf[i+3];
          }

        }
        else if (start == 'j' &&  conf[0] == weekday(est_sec))
        {
          type_journee = conf[1];
        }
        else if (start == 'f' && (conf[1] > year(est_sec)
          || (conf[1] == year(est_sec) && conf[2] > month(est_sec))
          || (conf[1] == year(est_sec) && conf[2] == month(est_sec) && conf[3] > day(est_sec)) 
          || (conf[1] == year(est_sec) && conf[2] == month(est_sec) && conf[3] == day(est_sec) && conf[4] > hour(est_sec))
          || (conf[1] == year(est_sec) && conf[2] == month(est_sec) && conf[3] == day(est_sec) && conf[4] == hour(est_sec) && conf[5] > minute(est_sec))))
        {

          type_journee = conf[0];
          //group_target( conf[0]);
        }
        else if (start == 'p'  && conf[1] == type_journee )
        {
          byte i = 2;
          int temp_tmp = 99 ;
          while (i+2<=pos)
          {
            if (conf[i]*60+conf[i+1] <= hour(est_sec)*60+minute(est_sec))
            {
              temp_tmp = conf[i+2]*100 ;
            }
            else if (list_pieces[conf[0]].v_chauf > 0)
            {  
              
                 long tmp = (long)(conf[i]*60+conf[i+1]-hour(est_sec)*60-minute(est_sec))*list_pieces[conf[0]].v_chauf/60;
             
                 if (tmp <= 500)
                      temp_tmp = max(temp_tmp,conf[i+2]*100-tmp);
                  
            }
            i=i+3;
            if (i>38) break;
          }
          group_target( conf[0], temp_tmp) ;
        }
      }
      do
      {
        pading  = f.read();
      }
      while (pading !='\n' and pading!=-1 ) ;
      //close the file:
    }
    while (pading!=-1) ;
    f.close();
    return(0);
  }
  else {
    // if the file didn't open, print an error:
    return(20);
  }
}









